//
//  ZYStatusDAL.swift
//  CZ29WeiboZYH
//
//  Created by 沐颜澈 on 16/7/8.
//  Copyright © 2016年 muyanche. All rights reserved.
//

import UIKit
// 清理缓存时间
private let Time: Double = -60*50


class ZYStatusDAL: NSObject {
    /*
    - 为什么缓存微博数据？
    - 如果本地有该条微博数据 直接从本地取 为用户节省流量
    - 读取缓存数据的过程
    - 开启app 请求数据
    - 01 检查本地是否有该条数据
    - 有  直接使用
    - 没有 再网络请求  然后在保存网络下载下来的微博数据
    
    
    */
    
    //删除缓存的数据
    
    class func deleteCatch() {
        
        //获取当前的时间
        let date = NSDate(timeIntervalSinceNow: Time)
        let df = NSDateFormatter()
        // 指定区域
        df.locale = NSLocale(localeIdentifier: "en_US")
        // 指定格式
        df.dateFormat = "yyyy-MM-dd HH:mm:ss"
        // 时间字符串
        let timeStr = df.stringFromDate(date)
        print(timeStr)
        
        // 准备sql
        let sql = "DELETE FROM T_Status WHERE createtime < '\(timeStr)'"
        
        //执行sql
        SQLManager.sharedTools.queue.inDatabase { (db) -> Void in
            let result = db.executeUpdate(sql, withArgumentsInArray: nil)
            
            if result {
                print("删除缓存成功")
            }else {
                print("删除缓存失败")
            }
        }
        
    
    }
    
    //检查本地是否有缓存数据
    class func checkCache(sinceId: Int64, maxId: Int64, success: SuccessClosure, failure: FailureClosure) {
        
        let result = getCache(sinceId, maxId: maxId)
        //检查
        if result?.count > 0 {
            
            //本地有数据
            print("本地获取")
            success(response: result)
            
        } else {
            //本地没有数据
            ZYNetworkTools.sharedNetworkTools.homeLoadStatusData(sinceId, maxId: maxId, success: { (response) -> () in
                
                guard let rsp = response?["status"] as? [[String: AnyObject]] else {
                
                    print("返回的数据为nil或者类型不匹配")
                    return
                }
                print("网络获取")
                
                success(response: rsp)
                
                //保存数据
                saveCache(rsp)
                
                }, failure: { (error) -> () in
                
                    failure(error: error)
            })
        }
    
    }
    
    //查询本地的微博数据
    class func getCache(sinceId: Int64, maxId: Int64) -> [[String: AnyObject]]? {
        
        //首先需要获取用户的userId
        guard let userId = ZYUserAccountTools.sharedTools.userAccount?.uid else {
            
            print("用户没有登录")
            return nil
        }
        
        //准备sql
        var sql = "SELECT * FROM T_Status\n"
        sql += "WHERE userid = \(userId)\n"
        
        //代表下拉刷新
        if sinceId > 0 {
            sql += "AND statusid > \(sinceId)\n"
        }
        //上拉加载更多
        if maxId > 0 {
            sql += "AND statusid <= \(maxId)\n"
            
        }
        sql += "ORDER BY statusid DESC\n"
        sql += "LIMIT 20\n"
        
        //执行sql 
        let result = SQLManager.sharedTools.execRecord(sql)
        //创建一个可变的临时数组
        var tempArr:[[String: AnyObject]] = [[String: AnyObject]]()
        //遍历数组
        for dic in result {
            let data = dic["status"] as! NSData
            let dict = try! NSJSONSerialization.JSONObjectWithData(data, options: []) as! [String: AnyObject]
            //保存数组
            tempArr.append(dict)
            
        }
        return tempArr
        
    }
    
    
    
    //保存网络下载的微博数据
    class func saveCache(status:[[String: AnyObject]]) {
        //用户id
        guard let userId = ZYUserAccountTools.sharedTools.userAccount?.uid else {
            print("用户没有登录")
            return
        }
        
        //准备sql
        
        let sql = "INSERT OR REPLACE INTO T_Status (statusid, status, userid) VALUES (?,?,?)"
        
        //执行sql
        SQLManager.sharedTools.queue.inTransaction { (db, rollback) -> Void in
            //使用循环
            for dic in status {
                //微博的id
                let statusId = dic["id"] as! NSNumber
                //微博的数据
                let statusDic = try! NSJSONSerialization.dataWithJSONObject(dic, options: [])
                
                let result = db.executeUpdate(sql, withArgumentsInArray: [statusId, statusDic, userId])
                
                if result {
                    print("保存数据成功")
                } else {
                    print("保存数据失败")
                    
                    //保存失败就事务回滚
                    rollback.memory = true
                    
                }
                
            }
            
            
        }
        
        
        
    }
}
